﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BIZMA._controls;
using BIZModel;
using BL.BIZControls;
using System.Web.Security;

namespace BIZMA._controls.Security
{
    public partial class List_Roles : BIZListControl, IBIZControlDefaultMethods
    {
        #region Default
        public void DefaultListLoad()
        {
            LoadRoles();
        }
        public void DefaultListLoad(Guid Id, string loadByType)
        {
            throw new NotImplementedException();
        }

        public void DefaultEditNew()
        {
            throw new NotImplementedException();
        }

        public void DefaultEditNew(Guid Id, string editByType)
        {
            throw new NotImplementedException();
        }

        public void DefaultEditLoad(Guid Id)
        {
            throw new NotImplementedException();
        }

        #endregion


        //Properties för att hålla reda på om en dialog kan öppnas eller om den redan är öppen i en underliggande dialog
        private bool CanAddRolePopup { get { return ViewState["CanAddRolePopup"] != null ? (bool)ViewState["CanAddRolePopup"] : true; } set { ViewState["CanAddRolePopup"] = value; } }

        //OLIKA ID properties som styr frågan för listan tex om man ska hämta utifrån EmployeeId eller PlanningId
        //Styrs av publika metoder
        //--

        //Olika filter för frågan till listan kan tex vara om man ska visa alla eller aktiva, eller datum mmm
        //Filter sätter man innan man kör de publika metorder som sätter ID properties som finns ovan
        /// <summary>
        /// Sök efter rollnamn som innehåller detta
        /// </summary>
        public string FilterBy_RoleName { get { return ViewState["FilterBy_RoleName"] != null ? (string)ViewState["FilterBy_RoleName"] : ""; } set { ViewState["FilterBy_RoleName"] = value; } }


        #region Init
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack || !InitLoaded)
            {
                InitLoaded = true;
                FillActionList();
                //Gör sådant som man gör på pageload här typ fyll "statisk" dropdown med värden mm 
                //Väldigt ovanligt att man laddar listan härifrån då det oftast görs via en annan metod se public void LOAD_BY_SOMETHING_LIST(int someval)
            }

        }

        protected override void OnInit(EventArgs e)
        {
            //här gör man alla init inställningar tex lägga till eventhandlers och annat som styr sidan
            //Peka ut dropdown för basklassen
            base.ActionDropDown = ddlAction;
            //Peka ut listkontrollen för basklassne
            base.ListControl = lv;
            //Kör om formpart har fler än 1 rad
            //base.SetFormPartHeight(1);

            base.OnInit(e);

            //Event när basklassen behöver listdatat
            base.NeedsData += new NeedsDataHandler(List_Users_NeedsData);


            if (ContainerControl != null)
            {
                //Titel på Caontainerkontrollen
                ContainerControl.Title = "Roller";
                //Event vid klick på knapparna i containerkontrollen
                //ContainerControl.ButtonsClick += new ButtonsHandler(ContainerControl_ButtonsClick);
                //Vilka knappar som ska visas
                ContainerControl.ShowButtons(false, false, false, false);

                //Om container är en modal dialog
                if (ModalContainerControl != null)
                {
                    ModalContainerControl.Width = 800;
                    ModalContainerControl.Height = 500;
                    //Event om storlek på modalakontrollen ändras kan användas för att justera storlek på andra element i kontrollen
                    ModalContainerControl.FormScrollStyleChanged += new EventHandler(ModalContainerControl_FormScrollStyleChanged);
                }

                CanAddRolePopup = mcRole.CanAddPopupControl(BIZControl.Role);
            }

            //Event när detaljdialogen stänger
            mcRole.ModalClosing += new ModalControlClosing(mcRole_ModalClosing);

            ListDataBound += new EventHandler<ListViewItemEventArgs>(List_Users_ListDataBound);
        }

        /// <summary>
        /// Fyller dropdown med värden
        /// </summary>
        private void FillActionList()
        {
            ddlAction.Items.Add(new ListItem("--Välj åtgärd--", "-"));
            if (PickerControl)
            {
                ddlAction.Items.Add(new ListItem("Välj", "SEL"));
                ddlAction.Items.Add(new ListItem("-------", "-"));
            }
            ddlAction.Items.Add(new ListItem("Radera", "DEL"));

        }

        /// <summary>
        /// Aktiverar/inaktiverar knappar som behöver data eller som inte kan visas pga underliggande dialoger 
        /// </summary>
        private void ToggleButtons()
        {
            //Sätt status om knappen kan visas pga underliggande dialoger
            BaseBL.BtnOpenEnabled(btnNew, CanAddRolePopup, ViewState);
        }

        #endregion
        #region Container Events
        /// <summary>
        /// Event när Container ändrar storlek
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void ModalContainerControl_FormScrollStyleChanged(object sender, EventArgs e)
        {
            //ListScroll Height sätts automatiskt i basklassen 
        }

        void List_Users_NeedsData(bool sorting)
        {
            LoadList(sorting);
        }
        
        ///// <summary>
        ///// Triggas vid klick på någon av containerkontrollens knappar
        ///// </summary>
        ///// <param name="sender">Containerkontrollen</param>
        ///// <param name="actionType">Vilken typ av knapp som klickats</param>
        //void ContainerControl_ButtonsClick(object sender, ActionType actionType)
        //{
        //    if (actionType == ActionType.Save || actionType == ActionType.SaveClose)
        //    {
        //        Save();
        //    }
        //    else if (actionType == ActionType.Delete)
        //    {
        //        Delete();
        //    }
        //}


        #endregion

        #region Events This Control
        /// Event  när man har knappar för att välja en rad i listan
        /// </summary>
        /// <param name="sender">Knappen som klickats</param>
        /// <param name="e">Knappens CommandEventArgs</param>
        protected void btnSel_Command(object sender, CommandEventArgs e)
        {
            SelectedItems = new List<Guid>();
            SelectedItems.Add(Guid.Parse(e.CommandArgument.ToString()));

            //Kör denna metod så att containercontrollen kan trigga ett SelectEvent tillbaka till sidan med containern 
            CallListSelect(this, null, MultipleSelect, SelectedItems);

        }
        /// <summary>
        /// Event när man har valt en/flera rader i listan och väljer att utföra något från åtgärdslistan tex (Välj eller radera) 
        /// </summary>
        /// <param name="sender">Knappen utför</param>
        /// <param name="e">EventArgs. Används inte det är vad man valt i ddlAction som är intressant</param>
        protected void btnAction_Click(object sender, EventArgs e)
        {
            if (ddlAction.SelectedValue != "-")
            {
                if (ddlAction.SelectedValue == "SEL")
                {
                    var selectedKeys = lv.GetSelectedDataKeys("chkSel");
                    SelectedItems = new List<Guid>();
                    foreach (DataKey dk in selectedKeys)
                    {
                        Guid contactId = Guid.Parse(dk.Value.ToString());
                        SelectedItems.Add(contactId);
                    }

                    CallListSelect(this, null, MultipleSelect, SelectedItems);
                }
                else
                {

                    var selectedKeys = lv.GetSelectedDataKeys("chkSel");
                    BIZMAEntities ent = BaseBL.GetEnt();

                    if (ddlAction.SelectedValue == "DEL")
                    {
                        foreach (DataKey dk in selectedKeys)
                        {

                            Guid roleId = Guid.Parse(dk.Value.ToString());
                            Role role = ent.Roles.FirstOrDefault(q => q.RoleId == roleId);

                            ent.DeleteObject(role);
           

                        }
                    }

                    ent.SaveChanges();
                }
            }

            LoadList(false);

        }

        /// <summary>
        /// Event för klick på sökfunktionen
        /// </summary>
        /// <param name="sender">Knappen</param>
        /// <param name="e">Knappens EventArgs</param>
        protected void btnSearch_Click(object sender, EventArgs e)
        {
            FilterBy_RoleName = txtSearchName.Text;

            LoadList(true);
        }


        #endregion


        #region Control and List methods
         /// <summary>
        /// Här rensas alla id properties som används för frågan till listan
        /// </summary>
        private void ResetIdProperties()
        {
            lv.DataSource = null;
            lv.DataBind();
        }
        /// <summary>
        /// Laddar listan med roller
        /// </summary>
        public void LoadRoles()
        {
            ResetIdProperties();
            LoadList(true);

        }
        /// <summary>
        /// Nollställ kontrollen och töm listan på värden
        /// </summary>
        public void Clear()
        {
            ResetIdProperties();
        }


        /// <summary>
        /// Metod som ansvarar för att fylla listan med värden utifrån vilken publik load metod som körts innan
        /// </summary>
        /// <param name="sorting">Talar om ifall sortering ska ändras eller om man ska använda tidigare sortering</param>
        private void LoadList(bool sorting)
        {
            InitLoaded = true;

            BIZMAEntities ent = BaseBL.GetEnt();

            IQueryable<BIZModel.Role> query = ent.Roles;

            if (query != null)
            {
                if (FilterBy_RoleName != "")
                {
                    query = query.Where(q => q.Name.Contains(FilterBy_RoleName));
                }
            }

            lv.DataSource = (from BIZModel.Role P in query
                             select new
                             {
                                 P.RoleId,
                                 P.Name,
                                 P.Comment
                             });

            lv.DataBind();

            if (!sorting)
                lv.ReSort(ViewState);
        }
        /// <summary>
        /// Event för varje rad som laddas i listan
        /// </summary>
        /// <param name="sender">Listan</param>
        /// <param name="e">ListViewItemEventArgs</param>
        void List_Users_ListDataBound(object sender, ListViewItemEventArgs e)
        {
            LinkButton lkb2 = (LinkButton)e.Item.FindControl("lkb2");

            string description = (string)DataBinder.Eval(e.Item.DataItem, "Comment");

            if (description.Length > 50)
            {
                description = description.Substring(0, 47) + "...";
            }

            lkb2.Text = description;
        }

        #endregion

        #region detail dialog
        /// <summary>
        /// Klickar för att öppna detaljvy från listan
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">CommandEventArgs</param>
        protected void OpenDetail_Command(object sender, CommandEventArgs e)
        {
            if (HandleListClickEvents)
            {
                CallHandleClick(this, Guid.Parse(e.CommandArgument.ToString()), null);
            }
            else
            {
                if (CanAddRolePopup)
                {
                    mcRole.AddDefaultEditLoad(BIZControl.Role, Guid.Parse(e.CommandArgument.ToString()));
                }
            }

        }
        /// <summary>
        /// Klickar för att lägga till nytt i listan
        /// </summary>
        /// <param name="sender">object</param>
        /// <param name="e">CommandEventArgs</param>
        protected void btnNew_Command(object sender, CommandEventArgs e)
        {
            if (HandleNewClickEvent)
            {
                CallNewHandleClick(this, Guid.Empty, null);
            }
            else
            {
                if (CanAddRolePopup)
                {
                    mcRole.AddDefaultEditNew(BIZControl.Role);
                }
            }
        }
        /// <summary>
        /// Event när rolldialogen stänger
        /// </summary>
        /// <param name="sender">ModalaContainern</param>
        /// <param name="e">EventArgs</param>
        void mcRole_ModalClosing(object sender, EventArgs e)
        {
            LoadList(false);
        }

        #endregion


    }
}